#!/bin/bash

#==============================================================================
# 移动应用图标生成器 (Mobile App Icon Generator)
#==============================================================================
# 
# 功能描述:
#   快速生成Android和iOS应用所需的全套图标尺寸
#   支持高质量图片转换和批量处理
#
# 作者: Pedro.Pei
# 版本: 2.0
# 更新日期: 2024
#
# 支持的输入格式:
#   📷 图片格式: PNG, JPG, JPEG, GIF, BMP, TIFF, WebP, HEIC
#   📐 推荐尺寸: 1024x1024px 或更高分辨率的正方形图片
#
# 生成的图标:
#   🤖 Android: 5种密度 (mdpi, hdpi, xhdpi, xxhdpi, xxxhdpi)
#   🍎 iOS: 12种尺寸 (通知、设置、Spotlight、应用、iPad、App Store)
#
# 使用方法:
#   ./generate_icons.sh <原始图片路径> [选项]
#
# 选项:
#   -o, --output <目录>    指定输出目录 (默认: 脚本所在目录)
#   -q, --quality <数值>   设置图片质量 1-100 (默认: 95)
#   -h, --help            显示帮助信息
#   -v, --verbose         显示详细处理信息
#
# 使用示例:
#   # 基本使用
#   ./generate_icons.sh app_icon.png
#   
#   # 指定输出目录和质量
#   ./generate_icons.sh app_icon.png -o ~/Desktop/icons -q 90 --verbose
#   
#   # 显示详细信息
#   ./generate_icons.sh app_icon.png --verbose
#
# 依赖要求:
#   📦 ImageMagick: brew install imagemagick
#
#==============================================================================

# 默认配置
SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd)
OUTPUT_DIR=""
QUALITY=95
VERBOSE=false
INPUT_IMAGE=""

# 颜色输出定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
PURPLE='\033[0;35m'
CYAN='\033[0;36m'
NC='\033[0m' # No Color

# 显示帮助信息
show_help() {
    echo -e "${CYAN}移动应用图标生成器 v2.0${NC}"
    echo ""
    echo "用法: $0 <原始图片路径> [选项]"
    echo ""
    echo "选项:"
    echo "  -o, --output <目录>    指定输出目录 (默认: 原始图片同级目录)"
    echo "  -q, --quality <数值>   设置图片质量 1-100 (默认: 95)"
    echo "  -h, --help            显示此帮助信息"
    echo "  -v, --verbose         显示详细处理信息"
    echo ""
    echo "支持的图片格式:"
    echo "  PNG, JPG, JPEG, GIF, BMP, TIFF, WebP, HEIC"
    echo ""
    echo "生成的图标:"
    echo "  🤖 Android: 5种密度图标 (48px - 192px)"
    echo "  🍎 iOS: 12种尺寸图标 (20px - 1024px)"
    echo ""
    echo "示例:"
    echo "  $0 app_icon.png"
    echo "  $0 app_icon.png -o ~/Desktop/icons -q 90"
    echo "  $0 app_icon.png --verbose"
}

# 日志输出函数
log_info() {
    echo -e "${BLUE}[INFO]${NC} $1"
}

log_success() {
    echo -e "${GREEN}[SUCCESS]${NC} $1"
}

log_warning() {
    echo -e "${YELLOW}[WARNING]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

log_verbose() {
    if [ "$VERBOSE" = true ]; then
        echo -e "${PURPLE}[VERBOSE]${NC} $1"
    fi
}

# 解析命令行参数
parse_arguments() {
    while [[ $# -gt 0 ]]; do
        case $1 in
            -h|--help)
                show_help
                exit 0
                ;;
            -o|--output)
                OUTPUT_DIR="$2"
                shift 2
                ;;
            -q|--quality)
                QUALITY="$2"
                shift 2
                ;;
            -v|--verbose)
                VERBOSE=true
                shift
                ;;
            -*)
                log_error "未知选项: $1"
                show_help
                exit 1
                ;;
            *)
                if [ -z "$INPUT_IMAGE" ]; then
                    INPUT_IMAGE="$1"
                else
                    log_error "只能指定一个输入图片文件"
                    exit 1
                fi
                shift
                ;;
        esac
    done
}

# 验证输入参数
validate_input() {
    # 检查是否提供了输入图片
    if [ -z "$INPUT_IMAGE" ]; then
        log_error "请提供输入图片路径"
        show_help
        exit 1
    fi
    
    # 检查输入文件是否存在
    if [ ! -f "$INPUT_IMAGE" ]; then
        log_error "输入文件不存在: $INPUT_IMAGE"
        exit 1
    fi
    
    # 检查文件是否为图片格式
    local file_type=$(file -b --mime-type "$INPUT_IMAGE")
    if [[ ! $file_type =~ ^image/ ]]; then
        log_error "输入文件不是有效的图片格式: $file_type"
        exit 1
    fi
    
    # 验证质量参数
    if ! [[ "$QUALITY" =~ ^[0-9]+$ ]] || [ "$QUALITY" -lt 1 ] || [ "$QUALITY" -gt 100 ]; then
        log_error "质量参数必须是1-100之间的数字"
        exit 1
    fi
    
    # 如果没有指定输出目录，使用原始图片的同级目录
    if [ -z "$OUTPUT_DIR" ]; then
        OUTPUT_DIR=$(dirname "$(realpath "$INPUT_IMAGE")")
    fi
    
    # 创建输出目录
    if [ ! -d "$OUTPUT_DIR" ]; then
        mkdir -p "$OUTPUT_DIR" || {
            log_error "无法创建输出目录: $OUTPUT_DIR"
            exit 1
        }
    fi
    
    log_verbose "输入文件: $INPUT_IMAGE"
    log_verbose "输出目录: $OUTPUT_DIR"
    log_verbose "图片质量: $QUALITY"
    log_verbose "文件类型: $file_type"
}

# 检查依赖
check_dependencies() {
    if ! command -v convert &> /dev/null; then
        log_error "需要安装ImageMagick"
        echo "安装方法:"
        echo "  macOS: brew install imagemagick"
        echo "  Ubuntu: sudo apt-get install imagemagick"
        echo "  CentOS: sudo yum install ImageMagick"
        exit 1
    fi
    
    local version=$(convert -version | head -n1)
    log_verbose "ImageMagick版本: $version"
}

# 生成单个图标
generate_icon() {
    local size=$1
    local output_path=$2
    local description=$3
    
    log_verbose "生成 $description ($size)"
    
    if convert "$INPUT_IMAGE" -resize "$size" -quality "$QUALITY" "$output_path" 2>/dev/null; then
        return 0
    else
        log_error "生成失败: $description"
        return 1
    fi
}

# 生成Android图标
generate_android_icons() {
    local android_dir="$OUTPUT_DIR/android_icons"
    mkdir -p "$android_dir"
    
    log_info "🤖 生成Android图标..."
    
    local -a android_icons=(
        "48x48:ic_launcher-mdpi.png:mdpi密度"
        "72x72:ic_launcher-hdpi.png:hdpi密度"
        "96x96:ic_launcher-xhdpi.png:xhdpi密度"
        "144x144:ic_launcher-xxhdpi.png:xxhdpi密度"
        "192x192:ic_launcher-xxxhdpi.png:xxxhdpi密度"
    )
    
    local success_count=0
    local total_count=${#android_icons[@]}
    
    for icon_info in "${android_icons[@]}"; do
        IFS=':' read -r size filename description <<< "$icon_info"
        if generate_icon "$size" "$android_dir/$filename" "$description"; then
            ((success_count++))
        fi
    done
    
    log_success "Android图标生成完成: $success_count/$total_count"
    return $((total_count - success_count))
}

# 生成iOS图标
generate_ios_icons() {
    local ios_dir="$OUTPUT_DIR/ios_icons"
    mkdir -p "$ios_dir"
    
    log_info "🍎 生成iOS图标..."
    
    local -a ios_icons=(
        "20x20:Icon-App-20x20@1x.png:通知图标@1x"
        "40x40:Icon-App-20x20@2x.png:通知图标@2x"
        "60x60:Icon-App-20x20@3x.png:通知图标@3x"
        "29x29:Icon-App-29x29@1x.png:设置图标@1x"
        "58x58:Icon-App-29x29@2x.png:设置图标@2x"
        "87x87:Icon-App-29x29@3x.png:设置图标@3x"
        "40x40:Icon-App-40x40@1x.png:Spotlight@1x"
        "80x80:Icon-App-40x40@2x.png:Spotlight@2x"
        "120x120:Icon-App-40x40@3x.png:Spotlight@3x"
        "60x60:Icon-App-60x60@1x.png:应用图标@1x"
        "120x120:Icon-App-60x60@2x.png:应用图标@2x"
        "180x180:Icon-App-60x60@3x.png:应用图标@3x"
        "76x76:Icon-App-76x76@1x.png:iPad图标@1x"
        "152x152:Icon-App-76x76@2x.png:iPad图标@2x"
        "167x167:Icon-App-83.5x83.5@2x.png:iPad Pro图标"
        "1024x1024:Icon-App-1024x1024@1x.png:App Store图标"
    )
    
    local success_count=0
    local total_count=${#ios_icons[@]}
    
    for icon_info in "${ios_icons[@]}"; do
        IFS=':' read -r size filename description <<< "$icon_info"
        if generate_icon "$size" "$ios_dir/$filename" "$description"; then
            ((success_count++))
        fi
    done
    
    log_success "iOS图标生成完成: $success_count/$total_count"
    return $((total_count - success_count))
}

# 显示生成统计
show_summary() {
    local android_failures=$1
    local ios_failures=$2
    local total_failures=$((android_failures + ios_failures))
    
    echo ""
    echo -e "${CYAN}=================== 生成完成 ===================${NC}"
    echo -e "📁 输出目录: ${YELLOW}$OUTPUT_DIR${NC}"
    echo -e "🤖 Android图标: ${YELLOW}$OUTPUT_DIR/android_icons/${NC}"
    echo -e "🍎 iOS图标: ${YELLOW}$OUTPUT_DIR/ios_icons/${NC}"
    echo ""
    
    if [ $total_failures -eq 0 ]; then
        echo -e "${GREEN}✅ 所有图标生成成功！${NC}"
    else
        echo -e "${YELLOW}⚠️  有 $total_failures 个图标生成失败${NC}"
    fi
    
    echo -e "${CYAN}===============================================${NC}"
}

# 主函数
main() {
    start_time=$(date +%s)
    echo ""
    echo -e "${CYAN}🚀 移动应用图标生成器 v2.0${NC}"
    echo ""
    
    # 解析参数
    parse_arguments "$@"
    
    # 验证输入
    validate_input
    
    # 检查依赖
    check_dependencies
    
    log_info "开始处理图片: $(basename "$INPUT_IMAGE")"
    log_info "开始时间: $(date)"
    
    # 生成图标
    generate_android_icons
    local android_failures=$?
    
    generate_ios_icons
    local ios_failures=$?
    
    # 显示统计
    show_summary $android_failures $ios_failures
    
    # 显示总耗时
    end_time=$(date +%s)
    duration=$((end_time - start_time))
    echo -e "${CYAN}⏱️  处理耗时: ${duration}秒${NC}"
    echo ""
    
    # 返回适当的退出码
    if [ $((android_failures + ios_failures)) -eq 0 ]; then
        exit 0
    else
        exit 1
    fi
}

# 执行主函数
main "$@"